package grupo2.bj;

import grupo2.exceptions.CartaInvalidaException;

/**Las cartas iran del 1 al 13. 
 *   El 1 representara al As.
 *   El 11 representara a la J.
 *   El 12 representara a la Q.
 *   El 13 representara a la K.
 * 
 * En cuanto al palo:
 *   Pica se representara con la P.
 *   Trebol se representara con la T.
 *   Corazon se representara con la C.
 *   Diamante se representara con la D.
 *   @author Grupo 2.
 */
public class Carta{
		
	private int numero;
	private char palo;
	private boolean tapada;
	
	/**
	 * Constructor. Crea un objeto carta.
	 * @author Grupo 2
	 * @param int numero, char palo.
	 * @return una instancia del objeto Carta.
	 */	
	public Carta(int numero, char palo) {
		if(numero==1)
			throw new CartaInvalidaException("No puede crearse una carta con valor 1. Debe crearse un As");
		this.setNumero(numero);
		this.setPalo(palo);
		this.tapada=false;
	}
	
	/**
	 * Constructor reservado para uso del Sabot. Realiza lo mismo que el otro 
	 * constructor pero previamente convierte el int en un char.
	 * @author Grupo 2
	 * @param int numero, int palo.
	 * @return una instancia del objeto Carta.
	 */
	public Carta(int numero, int palo){
		this.setNumero(numero);
		this.setPalo(this.getPalo(palo));
	}
	
	public Carta(){
	}
	
	/**
	 * Las cartas internamente se representan con numeros. Este metodo 
	 * lo que hace es mostrar el verdadero numero de las cartas.
	 * Como ser: As, J, Q, K.
	 * @author Grupo 2
	 * @param void.
	 * @return String.
	 */
	public String getNumero(){
		switch (this.numero){
		case 11:
			return "J";
		
		case 12:
			return "Q";
		
		case 13:
			return "K";
			
		default: 
			return Integer.toString(this.numero);
		
		}
	}
	
	/**
	 * @author Grupo 2.
	 * @param int.
	 * @return void.
	 */
	public void setNumero(int numero) {
		this.numero = numero;
	}
	
	/**
	 * Devuelve el char correspondiente al palo de una carta.
	 * @author Grupo 2.
	 * @param void.
	 * @return char.
	 */
	public char getPalo() {
		return palo;
	}
	
	/**
	 * A partir de un numero dado, busca su correspondencia con el char 
	 * representativo del palo de una carta.
	 * @author Grupo 2.
	 * @param int.
	 * @return char.
	 */
	public char getPalo(int num){
		switch (num){
		case 1:
			return 'P';
		
		case 2:
			return 'T';
		
		case 12:
			return 'C';
		
		default:
			return 'D';
		}
	}
	
	/**
	 * @author Grupo 2.
	 * @param char.
	 * @return void.
	 */
	public void setPalo(char palo) {
		this.palo = palo;
	}
	
	/**
	 * Redefinicion del metodo heredado de Object. Devuelve en un string el numero
	 * y palo de la carta.
	 * @author Grupo 2.
	 * @param void.
	 * @return String.
	 */
	public String toString() {
		String palo;
				
		switch (this.palo){
		case 'P':
			palo = "Pica";
		break;
		
		case 'T':
			palo = "Trebol";
		break;
		
		case 'C':
			palo = "Corazon";
		break;
		
		default:
			palo = "Diamante";
		break;
		}
		
		return this.getNumero() + " de " + palo;
	}
	
	/**
	 * Devuelve el valor que toma la carta una vez que arranca la partida.
	 * @author Grupo 2.
	 * @param void.
	 * @return int.
	 */
	public int getValor(){
		if(this.isTapada())
			return 0;
		
		switch (numero){
		case 11:
			return 10;
		
		case 12:
			return 10;
		
		case 13:
			return 10;
			
		default: 
			return numero;
		}
	}
	
	/**
	 * Verifica si una carta es un as o no.
	 * @author Grupo 2.
	 * @param void.
	 * @return boolean. True: si la carta es un As. False: en caso contrario.
	 */
	public boolean isAs(){
		return false;
	}

	public boolean isMenorQue(int nro){
		return this.numero < nro;
	}
	
	public boolean equals(Object o){
		if(!(o instanceof Carta))
			return false;
		
		Carta carta= (Carta) o;
		return (this.numero== carta.numero);
	}
	
	public int hashCode(){
		return (int)this.numero;
		}

	public boolean isTapada() {
		return tapada;
	}

	public void setTapada(boolean tapada) {
		this.tapada = tapada;
	}
	
	public void destaparCarta(){
		this.setTapada(false);
	}
	
	public void taparCarta(){
		this.setTapada(true);
	}
}